#pragma once
#include <iostream>
#include <string>
#include <unordered_map>

namespace MyRpc
{
    // 请求
    #define KEY_METHOD "method"     // 请求/响应方法名称
    #define KEY_PARAMS "parameters" // 请求方法的参数

    // 主题操作请求
    #define KEY_TOPIC_KEY "topic_key" // 请求的主题
    #define KEY_TOPIC_MSG "topic_msg" // 请求信息
    #define KEY_OPTYPE "optype"       // 操作类型
    #define KEY_HOST "host"      // ★★★ 发起请求的主机,在 _body[KEY_HOST] 中是一个Json对象,存储 ip 和 port 
    #define KEY_HOST_IP "ip"     // 发起请求的ip地址
    #define KEY_HOST_PORT "port" // 发起请求的端口号

    // 响应
    #define KEY_RCODE "rcode"   // 响应码
    #define KEY_RESULT "result" // ★★★ 响应结果,在 _body[KEY_RESULT] 中是一个Json对象

    enum class MType //message type
    {
        REQ_RPC = 0,  // 请求
        RSP_RPC,      // 响应
        REQ_TOPIC,    // 请求主题
        RSP_TOPIC,    // 响应主题
        REQ_SERVICE,  //请求服务
        RSP_SERVICE   //响应服务
    };

    enum class RCode  // 响应码
    {
        RCODE_OK = 0,
        RCODE_PARSE_ERROR,        // 解析错误
        RCODE_MSG_ERROR,          // 消息出错
        RCODE_DISCONNECTED,       // 连接已断开
        RCODE_PARAMS_ERROR,       // 参数错误
        RCODE_NOT_FOUND_SERVICE,  // 找不到该服务
        RCODE_OPTYPE_ERROR,       // 类型错误
        ROCDE_NOT_FOUND_TOPIC     // 找不到该主题
    };


    // 错误原因
    static std::string ErrRes(RCode code)
    {
        static std::unordered_map<RCode,std::string> err_map = {
            {RCode::RCODE_OK,"Success"},
            {RCode::RCODE_PARSE_ERROR,"Parse Error"},
            {RCode::RCODE_MSG_ERROR,"Message Error"},
            {RCode::RCODE_DISCONNECTED,"Disconnected"},
            {RCode::RCODE_PARAMS_ERROR,"Params Error"},
            {RCode::RCODE_NOT_FOUND_SERVICE,"Not Found Service"},
            {RCode::RCODE_OPTYPE_ERROR,"Optype Error"},
            {RCode::ROCDE_NOT_FOUND_TOPIC,"Not Found Topic"},
        };

        auto it = err_map.find(code);
        if(it == err_map.end())
            return "Unknow Error Code";
        return it->second;
    }

    // 请求类型
    enum class RType
    {
        REQ_SYNC = 0,       // 同步请求
        REQ_ASYNC,          // 异步请求
        REQ_CALLBACK        // 回调请求
    };


    // 主题操作
    enum class TopicOpType
    {
        TOPIC_CREATE = 0,           // 主题创建
        TOPIC_REMOVE,               // 主题删除
        TOPIC_SUBSCRIBE,            // 主题订阅
        TOPIC_CANCEL_SUBSCRIBE,     // 取消主题订阅
        TOPIC_PUBLISH               // 主题发布
    };
    
    // 服务
    enum class ServiceOpType
    {
        SERVICE_REGISTRY,           // 服务注册
        SERVICE_DISCOVERY,          // 服务发现
        SERVICE_ONLINE,             // 服务在线
        SERVICE_OFFLINE             // 服务下线
    };
}